#include <tuple>
#include <string>
#include <iostream>

// int main() {
//     // 创建一个包含3个元素的tuple: int, double, string
//     std::tuple<int, double, std::string> t1(10, 3.14, "hello");
    
//     // 使用make_tuple自动推导类型
//     auto t2 = std::make_tuple(20, 2.718, "world");
    
//     // C++11起可以使用类模板参数推导
//     std::tuple t3(30, 1.618, "cpp");
//     // 自动推导为tuple<int, double, const char*>

//     std::cout << std::get<0>(t1) << std::endl;
//     std::cout << std::get<1>(t1) << std::endl;
//     std::cout << std::get<2>(t1) << std::endl;

//     return 0;
// }

// 空tuple基类
template<typename...>
class Tuple {};

// 递归特化
template<typename Head, typename... Tail>
class Tuple<Head, Tail...> : private Tuple<Tail...> 
{
public:
    Head value;

    // 构造函数
    Tuple(const Head& head, const Tail&... tail)
    : Tuple<Tail...>(tail...), value(head) {}

    // 获取元素
    template<size_t I>
    auto& get() 
    {
        if constexpr (I == 0) 
        {
            return value;
        } 
        else 
        {
            return Tuple<Tail...>::template get<I-1>();
        }
    }
};